package com.kfm.base.oop4;

import com.kfm.base.oop2.pm.Person;

public class Student extends Person {

    private String name;

    private Integer age;

    private Character gender;

    private String id;


    public Student(String name, int age, Character gender, String id) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.id = id;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + this.name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }


    /**
     * 重写 equals 要求：
     * 对 null 返回 false
     * 自反性：x.equals(x) 返回true
     * 对称性： x.equals(y) 的值 和 y.equals(x) 的值一样
     * 传递性： x.equals(y) 为 true, y.equals(z) 为 true, 此时 x.equals(z) 为 true
     * 一致性： x.equals(y) 多次调用结果一致
     *  重写了 equals 就要重写 hashCode
     * @param obj
     * @return
     */
    @Override
    public boolean equals(Object obj) {

        // this   obj
        if (obj == null) {
            return false;
        }

        if (this == obj) {
            return true;
        }

        // 类型转换, 有继承关系 向上转型 和 向下转型
        // Student --> Object  向上转型
//        Object o = this;
        // Object --> student 向下转型 强制类型转换,
        // instanceof 其类型的对象或其子类型的对象都是 true
        // 同一个类。如果值允许说 同一个类的对象才能判断true 则使用 getClass  if(this.getClass() == obj.getClass())
        if (obj instanceof Student stu){ // 同一个类型。只要是 student 或者 student的子类都可以
            // 大多数情况下，对象的每个属性都一样则认为 equals 为 true
            if (!stu.id.equals(this.id)) {
                return false;
            }

            if (!stu.name.equals(this.name)){
                return false;
            }

            if (!stu.age.equals(this.age)){
                return false;
            }

            if (!stu.gender.equals(this.gender)){
                return false;
            }
            return true;
        }
        return false;
    }

    /*
        equals 结果为 true hashCode 值一样
        hashCode 一样 equals 结果不一定
     */
    @Override
    public int hashCode() {
       int result = 1;
       result = 31 * result + name.hashCode();
       result = 31 * result + age;
       result = 31 * result + gender;
       result = 31 * result + id.hashCode();

       return result;
    }
}
